﻿using System;
using System.Collections.Generic;
using Mbl.ParameterizedTest.FluentCollectionBuilding;
using Mbl.ParameterizedTest.FluentCollectionBuilding.RowCollectors;

namespace Mbl.ParameterizedTest
{
    public class ParameterizedTest
    {       
        public static ParameterizedTestContext<TSut> Setup<TSut>(Func<TSut> setup)
        {            
            return new ParameterizedTestContext<TSut>(setup);
        }

        public static GeneralTestRowCollector<TIn1, TOut> For<TIn1, TOut>(Func<TIn1, TOut> methodUnderTest)
        {                             
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

        public static IntTestRowCollector<TIn1> For<TIn1>(Func<TIn1, int> methodUnderTest)
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

		public static StringTestRowCollector<TIn1> For<TIn1>(Func<TIn1, string> methodUnderTest)
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

		public static EnumerableTestRowCollector<TIn1, TElement> For<TIn1, TElement>(Func<TIn1, IEnumerable<TElement>> methodUnderTest)			
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

        public static GeneralTestRowCollector<TIn1, TIn2, TOut> For<TIn1, TIn2, TOut>(Func<TIn1, TIn2, TOut> methodUnderTest)
        {                             
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

        public static IntTestRowCollector<TIn1, TIn2> For<TIn1, TIn2>(Func<TIn1, TIn2, int> methodUnderTest)
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

		public static StringTestRowCollector<TIn1, TIn2> For<TIn1, TIn2>(Func<TIn1, TIn2, string> methodUnderTest)
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

		public static EnumerableTestRowCollector<TIn1, TIn2, TElement> For<TIn1, TIn2, TElement>(Func<TIn1, TIn2, IEnumerable<TElement>> methodUnderTest)			
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

        public static GeneralTestRowCollector<TIn1, TIn2, TIn3, TOut> For<TIn1, TIn2, TIn3, TOut>(Func<TIn1, TIn2, TIn3, TOut> methodUnderTest)
        {                             
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

        public static IntTestRowCollector<TIn1, TIn2, TIn3> For<TIn1, TIn2, TIn3>(Func<TIn1, TIn2, TIn3, int> methodUnderTest)
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

		public static StringTestRowCollector<TIn1, TIn2, TIn3> For<TIn1, TIn2, TIn3>(Func<TIn1, TIn2, TIn3, string> methodUnderTest)
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

		public static EnumerableTestRowCollector<TIn1, TIn2, TIn3, TElement> For<TIn1, TIn2, TIn3, TElement>(Func<TIn1, TIn2, TIn3, IEnumerable<TElement>> methodUnderTest)			
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

        public static GeneralTestRowCollector<TIn1, TIn2, TIn3, TIn4, TOut> For<TIn1, TIn2, TIn3, TIn4, TOut>(Func<TIn1, TIn2, TIn3, TIn4, TOut> methodUnderTest)
        {                             
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

        public static IntTestRowCollector<TIn1, TIn2, TIn3, TIn4> For<TIn1, TIn2, TIn3, TIn4>(Func<TIn1, TIn2, TIn3, TIn4, int> methodUnderTest)
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

		public static StringTestRowCollector<TIn1, TIn2, TIn3, TIn4> For<TIn1, TIn2, TIn3, TIn4>(Func<TIn1, TIn2, TIn3, TIn4, string> methodUnderTest)
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

		public static EnumerableTestRowCollector<TIn1, TIn2, TIn3, TIn4, TElement> For<TIn1, TIn2, TIn3, TIn4, TElement>(Func<TIn1, TIn2, TIn3, TIn4, IEnumerable<TElement>> methodUnderTest)			
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

        public static GeneralTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TOut> For<TIn1, TIn2, TIn3, TIn4, TIn5, TOut>(Func<TIn1, TIn2, TIn3, TIn4, TIn5, TOut> methodUnderTest)
        {                             
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

        public static IntTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5> For<TIn1, TIn2, TIn3, TIn4, TIn5>(Func<TIn1, TIn2, TIn3, TIn4, TIn5, int> methodUnderTest)
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

		public static StringTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5> For<TIn1, TIn2, TIn3, TIn4, TIn5>(Func<TIn1, TIn2, TIn3, TIn4, TIn5, string> methodUnderTest)
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

		public static EnumerableTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TElement> For<TIn1, TIn2, TIn3, TIn4, TIn5, TElement>(Func<TIn1, TIn2, TIn3, TIn4, TIn5, IEnumerable<TElement>> methodUnderTest)			
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

        public static GeneralTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut> For<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut>(Func<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut> methodUnderTest)
        {                             
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

        public static IntTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6> For<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6>(Func<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, int> methodUnderTest)
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

		public static StringTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6> For<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6>(Func<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, string> methodUnderTest)
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

		public static EnumerableTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TElement> For<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TElement>(Func<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, IEnumerable<TElement>> methodUnderTest)			
        {
            return new ParameterizedTestContext<int>(() => 0)
                .For(_ => methodUnderTest);
        }

    }
}
 